home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
051-075
/
disk_054
/
ispell
/
tree.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
3KB
|
184 lines
/* -*- Mode:Text -*- */
/*
* tree.c - a tree style dictionary for user's personal words
*
* Pace Willisson, 1983
*/
#include <stdio.h>
#include <ctype.h>
#include "ispell.h"
char *getenv();
char *upcase();
static struct node *root = NULL;
struct node *tinsert();
static char personaldict[100];
static FILE *dictf;
static newwords = 0;
treeinit ()
{
char *p;
char buf[BUFSIZ];
p = getenv ("HOME");
if (p == NULL)
return;
strcpy (personaldict, p);
strcat (personaldict, "/ispell.words");
if ((dictf = fopen (personaldict, "r")) == NULL)
return;
while (fgets (buf, sizeof buf, dictf) != NULL) {
int len = strlen (buf) - 1;
if (buf [ len ] == '\n')
buf [ len ] = 0;
treeinsert (buf, 1);
}
fclose (dictf);
newwords = 0;
if (!lflag && !aflag && access (personaldict, 2) < 0)
printf ("Warning: Cannot update personal dictionary (%s)\r\n", personaldict);
}
treeprint ()
{
printf ("(");
tprint (root);
printf (")");
}
static
tprint (root)
struct node *root;
{
if (root == NULL)
return;
printf ("%s ", root->word);
tprint (root->left);
tprint (root->right);
}
treeinsert (word, keep)
char *word;
{
char nword[BUFSIZ];
strcpy (nword, word);
root = tinsert (upcase (nword), root, keep);
newwords = newwords || keep;
}
static
struct node *
tinsert (word, root, keep)
char *word;
struct node *root;
{
int cmp;
if (root == NULL) {
root = (struct node *) calloc (1, sizeof (struct node));
root->word = (char *) malloc (strlen (word) + 1);
strcpy (root->word, word);
root->keep = keep;
return (root);
}
cmp = strcmp (word, root->word);
if (cmp == 0)
return (root);
if (cmp < 0)
root->left = tinsert (word, root->left, keep);
else
root->right = tinsert (word, root->right, keep);
return (root);
}
treelookup (word)
char *word;
{
char nword[BUFSIZ];
strcpy (nword, word);
if (tlookup (upcase (nword), root)) {
return (1);
}
return (0);
}
static
tlookup (word, root)
char *word;
struct node *root;
{
int cmp;
if (root == NULL)
return (0);
cmp = strcmp (word, root->word);
if (cmp == 0)
return (1);
if (cmp < 0)
return (tlookup (word, root->left));
else
return (tlookup (word, root->right));
}
treeoutput ()
{
if (newwords == 0)
return;
if ((dictf = fopen (personaldict, "w")) == NULL) {
fprintf (stderr, "Can't create %s\r\n", personaldict);
return;
}
toutput1 (root);
newwords = 0;
fclose (dictf);
}
static
toutput1 (root)
struct node *root;
{
if (root == NULL)
return;
if (root->keep)
fprintf (dictf, "%s\n", root->word);
toutput1 (root->left);
toutput1 (root->right);
}
char *
upcase (s)
register char *s;
{
register char *os = s;
while (*s) {
if (islower (*s))
*s = toupper (*s);
s++;
}
return (os);
}